#if defined (_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

#ifndef JETBYTE_TOOLS_WIN32_THREAD_INCLUDED__
#define JETBYTE_TOOLS_WIN32_THREAD_INCLUDED__


#ifndef _WINDOWS_
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
#endif

///////////////////////////////////////////////////////////////////////////////
// Namespace: OldDreamTools::Win32
///////////////////////////////////////////////////////////////////////////////

namespace OldDreamTools {
namespace Win32 {

///////////////////////////////////////////////////////////////////////////////
// CThread
///////////////////////////////////////////////////////////////////////////////

class CThread
{
   public :

      CThread();

      virtual ~CThread();

      HANDLE GetHandle() const;

      void Wait() const;

      bool Wait(DWORD timeoutMillis) const;

      void Start();

      void Terminate(
         DWORD exitCode = 0);

   private :

      virtual int Run() = 0;

      static unsigned int __stdcall ThreadFunction(void *pV);

      HANDLE m_hThread;

      // No copies do not implement
      CThread(const CThread &rhs);
      CThread &operator=(const CThread &rhs);
};

///////////////////////////////////////////////////////////////////////////////
// Namespace: OldDreamTools::Win32
///////////////////////////////////////////////////////////////////////////////

} // End of namespace Win32
} // End of namespace OldDreamTools

///////////////////////////////////////////////////////////////////////////////
// Lint options
//
//lint -restore
//
///////////////////////////////////////////////////////////////////////////////

#endif // JETBYTE_TOOLS_WIN32_THREAD_INCLUDED__

///////////////////////////////////////////////////////////////////////////////
// End of file
///////////////////////////////////////////////////////////////////////////////

